#include "List.h"

ListNode* ListInit()
{
	ListNode* plist = ListBuyNode(-1);
	return plist;
}

ListNode* ListBuyNode(SLDatatype x)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
	if (newnode == NULL)
	{
		perror("newnode fail!");
		exit(1);
	}
	newnode->data = x;
	newnode->next = newnode;
	newnode->prev = newnode;
	return newnode;
}

void ListPushBack(ListNode* pphead,SLDatatype x)
{
	assert(pphead);
	ListNode* newnode = ListBuyNode(x);
	newnode->next = pphead;
	newnode->prev = pphead->prev;
	pphead->prev->next = newnode;
	pphead->prev = newnode;
}

void my_printf(ListNode* head)
{
	assert(head);
	ListNode* pcur = head->next;
	while (pcur!=head)
	{
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("\n");
}

void ListPushFront(ListNode*pphead, SLDatatype x)
{
	assert(pphead);
	ListNode* newnode = ListBuyNode(x);
	newnode->next = pphead->next;
	newnode->prev = pphead;
	pphead->next->prev = newnode;
	pphead->next = newnode;
}

void ListPopBack(ListNode* pphead)
{
	assert(pphead&&pphead->next!=pphead);
	ListNode* del = pphead->prev;
	pphead->prev = del->prev;
	del->prev->next = pphead;
	free(del);
	del = NULL;
}

void ListPopFront(ListNode* pphead)
{
	assert(pphead&&pphead->next!=pphead);
	ListNode* frontdel = pphead->next;
	pphead->next = frontdel->next;
	frontdel->next->prev = pphead;
	free(frontdel);
	frontdel = NULL;
}

bool ListEmpty(ListNode* pphead)
{
	return pphead->next == pphead ? false : true;
}

ListNode* ListFind(ListNode* pphead, SLDatatype x)
{
	assert(pphead && ListEmpty(pphead) != false);
	ListNode* pcur = pphead->next;
	while (pcur->data != x)
	{
		if (pcur->next == pphead)
			return NULL;
		pcur = pcur->next;
	}
	return pcur;
}

void ListposPushBack(ListNode* find, SLDatatype x)
{
	assert(find);
	ListNode*newnode= ListBuyNode(x);
	newnode->next = find->next;
	newnode->prev = find;
	find->next = newnode;
	find->next->prev = newnode;
}

void Listerase(ListNode* find)
{
	assert(find);
	find->prev->next = find->next;
	find->next->prev = find->prev;
	free(find);
	find = NULL;
}

void ListDestroyt(ListNode* pphead)
{
	assert(pphead&&pphead->next!=pphead);
	ListNode* del = pphead->prev;
	while (del!= pphead)
	{
		ListNode* tmp = del->prev;
		free(del);
		del = tmp;
	}
	free(pphead);
	pphead = del = NULL;
}